home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / cuj0696.zip / DWYER.ZIP / QFLOAT / QFLTD.ASM < prev    next >
Assembly Source File  |  1996-02-24  |  15KB  |  758 lines

  1. ; 68020 version of qfltb.c
  2. ; Uses 32*32=64 bit multiply and divide instructions.
  3. ; Copyright 1989 by Stephen L. Moshier
  4.  
  5.     IDENT qfltd
  6. ; Set NQ = size of number in words.
  7. ; Also adjust rndbit[] array to have a 1 bit in the rounding
  8. ; position (see at end of the file).
  9. NQ    equ    24
  10.  
  11.     GLOBAL shdn1
  12. shdn1    LINK    A6,#0
  13.     MOVEM.L    D7/A5,-(A7)
  14.     MOVE.L    8(A6),A5
  15.     ADDQ.L    #4,A5
  16.     MOVEQ    #NQ-2,D7
  17.     MOVE.W    #0,CCR
  18. sdnl    ROXR    (A5)+
  19.     DBRA    D7,sdnl
  20.     MOVEM.L    (A7)+,A5/D7
  21.     UNLK    A6
  22.     RTS
  23.  
  24.     GLOBAL shup1
  25. shup1    LINK    A6,#0
  26.     MOVEM.L    D7/A5,-(A7)
  27.     MOVE.L    8(A6),A5
  28.     ADDA.W    #NQ+NQ+2,A5
  29.     MOVEQ    #NQ-2,D7    ; do NQ-1 words
  30.     MOVE    #0,CCR
  31. sup1l    ROXL    -(A5)
  32.     DBRA    D7,sup1l
  33.     MOVEM.L    (A7)+,A5/D7
  34.     UNLK    A6
  35.     RTS
  36.  
  37.     GLOBAL shdn8
  38. shdn8    LINK    A6,#0
  39.     MOVEM.L    D7/A5/A4,-(A7)
  40.     MOVE.L    8(A6),A5
  41.     ADDA.W    #NQ+NQ+1,A5
  42.     MOVEA.L    A5,A4
  43.     ADDQ.L    #1,A4
  44.     MOVEQ    #NQ+NQ-4,D7    ; (NQ-1) * 2 - 1 - 1
  45. sd8l    MOVE.B    -(A5),-(A4)
  46.     DBRA    D7,sd8l
  47.     MOVE.B    #0,-(A4)
  48.     MOVEM.L    (A7)+,A4/A5/D7
  49.     UNLK    A6
  50.     RTS
  51.  
  52.     GLOBAL shup8
  53. shup8    LINK    A6,#0
  54.     MOVEM.L    D7/A5/A4,-(A7)
  55.     MOVE.L    8(A6),A5
  56.     ADDQ    #4,A5
  57.     MOVEA.L    A5,A4
  58.     ADDQ.L    #1,A4
  59.     MOVEQ    #NQ+NQ-4,D7    ; (NQ-1) * 2 - 1 - 1
  60. su8l    MOVE.B    (A4)+,(A5)+
  61.     DBRA    D7,su8l
  62.     MOVE.B    #0,(A5)
  63.     MOVEM.L    (A7)+,A4/A5/D7
  64.     UNLK    A6
  65.     RTS
  66.  
  67.     GLOBAL shdn16
  68. shdn16    LINK    A6,#0
  69.     MOVEM.L    D7/A5/A4,-(A7)
  70.     MOVE.L    8(A6),A5
  71.     ADDA.W    #NQ+NQ,A5
  72.     MOVEA.L    A5,A4
  73.     ADDQ.L    #2,A4
  74.     MOVEQ    #NQ-3,D7    ; do NQ-2 words
  75. sd6l    MOVE.W    -(A5),-(A4)
  76.     DBRA    D7,sd6l
  77.     MOVE.W    #0,-(A4)
  78.     MOVEM.L    (A7)+,A4/A5/D7
  79.     UNLK    A6
  80.     RTS
  81.  
  82.     GLOBAL shup16
  83. shup16    LINK    A6,#0
  84.     MOVEM.L    D7/A5/A4,-(A7)
  85.     MOVE.L    8(A6),A5
  86.     ADDQ    #4,A5
  87.     MOVEA.L    A5,A4
  88.     ADDQ.L    #2,A4
  89.     MOVEQ    #NQ-3,D7    ; do NQ-2 words
  90. su6l    MOVE.W    (A4)+,(A5)+
  91.     DBRA    D7,su6l
  92.     MOVE.W    #0,(A5)
  93.     MOVEM.L    (A7)+,A4/A5/D7
  94.     UNLK    A6
  95.     RTS
  96.  
  97.     GLOBAL addm
  98. addm    LINK    A6,#0
  99.     MOVEM.L    D7/A5/A4,-(A7)
  100.     MOVE.L    8(A6),A4
  101.     ADDA.W    #NQ+NQ+2,A4 ; 2 * (2 + (NQ-1))
  102.     MOVE.L    12(A6),A5
  103.     ADDA.W    #NQ+NQ+2,A5
  104.     MOVEQ    #NQ-2,D7
  105.     MOVE    #0,CCR
  106. add1l    ADDX.W    -(A4),-(A5)
  107.     DBRA    D7,add1l
  108.     MOVEM.L    (A7)+,A4/A5/D7
  109.     UNLK    A6
  110.     RTS
  111.  
  112.     GLOBAL subm
  113. subm    LINK    A6,#0
  114.     MOVEM.L    D7/A5/A4,-(A7)
  115.     MOVE.L    8(A6),A4
  116.     ADDA.W    #NQ+NQ+2,A4 ; 2 * (2 + (NQ-1))
  117.     MOVE.L    12(A6),A5
  118.     ADDA.W    #NQ+NQ+2,A5
  119.     MOVEQ    #NQ-2,D7
  120.     MOVE    #0,CCR
  121. sub1l    SUBX.W    -(A4),-(A5)
  122.     DBRA    D7,sub1l
  123.     MOVEM.L    (A7)+,A4/A5/D7
  124.     UNLK    A6
  125.     RTS
  126.  
  127. ; Variable precision multiply of significands.
  128. ; c must not be in the same location as either a or b.
  129. ;
  130. ; static int mulv( a, b, c, prec )
  131. ; unsigned short a[], b[], c[];
  132. ; int prec;
  133.  
  134.     GLOBAL mulv
  135. mulv    LINK    A6,#0
  136.     MOVEM.L    D7/D6/D5/D4/D3/D2/D1/A5/A4/A3/A2/A1,-(A7)
  137.     MOVE.L    8(A6),A4
  138.     MOVE.L    12(A6),A5
  139.     MOVE.L    16(A6),A3
  140.     MOVE.L    20(A6),D6    ; precision, in words
  141.  
  142. ; clear the output array of prec+3 words
  143.     MOVE.L    D6,D7
  144.     ADDQ.L    #2,D7
  145. ;    MOVE.L    A3,A0
  146. ;    ADDQ    #4,A0
  147.     LEA    4(A3),A0
  148.     CLR.L    D1
  149. mv2l
  150.     MOVE.W    D1,(A0)+
  151.     DBRA    D7,mv2l
  152.  
  153.  
  154. ; for( k=prec+1; k>=3; k -= 2 )
  155.     MOVE.L    D6,D7    ; prec
  156.     ASL.L    #1,D7
  157.     ADDA.L    D7,A3
  158.     ADDQ    #6,A3    ; r = &c[prec+3];
  159.     ADDQ.L    #2,D7    ; D7 = 2*k, k = prec+1
  160. ; {
  161. mv0l    MOVE.L    A5,A1    ; q = &b[3];
  162.     ADDQ    #6,A1
  163.     MOVEA.L    A4,A0
  164.     ADDA.L    D7,A0    ; p = &a[k];
  165.  
  166. ; for( i=k; i>=3; i-- )
  167. ;    {
  168.     MOVE.L    D7,D5    ; 2*k
  169.  
  170. ;    if( (*p == 0) || (*q == 0) )
  171. ;        {
  172. ;        --p;
  173. ;        ++q;
  174. ;        continue;
  175. ;        }
  176.     ADDQ.L    #4,A0
  177.     MOVE.L    (A3),D6
  178.     MOVE.L    -(A3),D4
  179.     MOVE.W    -(A3),D2
  180. mv1l    MOVE.L    -(A0),D0    ; *p--
  181.     DATA.W    $4C11, $0403    ;MULU.L    (A1),D3:D0
  182.     ADDQ    #4,A1
  183.     ADD.L    D0,D6
  184.     ADDX.L    D3,D4
  185.     ADDX.W    D1,D2
  186.     SUBQ    #4,D5
  187.     CMPI.W    #6,D5
  188.     BGE.S    mv1l
  189.  
  190.     MOVE.W    D2,(A3)+
  191.     MOVE.L    D4,(A3)+
  192.     MOVE.L    D6,(A3)
  193.     SUBQ    #4,A3
  194.     SUBQ    #4,D7
  195.     CMPI.W    #6,D7
  196.     BGE.S    mv0l
  197.  
  198.     MOVEM.L    (A7)+,A1/A2/A3/A4/A5/D7/D6/D5/D4/D3/D2/D1
  199.     UNLK    A6
  200.     RTS
  201.  
  202. ; Variable precision square.
  203. ; b must be in a different location from a.
  204. ;
  205. ; static squarev( a, b, prec )
  206. ; unsigned short a[], b[];
  207. ; int prec;
  208. ; {
  209.  
  210.     GLOBAL squarev
  211. squarev    LINK    A6,#0
  212.     MOVEM.L    D7/D6/D5/D3/D2/D1/A5/A4/A3/A2/A1,-(A7)
  213.     MOVE.L    8(A6),A4    ; a
  214.     MOVE.L    12(A6),A3    ; b
  215.     MOVE.L    16(A6),D6    ; precision, in words
  216.  
  217. ; clear the output array of prec+3 words
  218.     MOVE.L    D6,D7    ; prec
  219.     ADDQ.L    #2,D7
  220.     MOVE.L    A3,A0    ; b
  221.     ADDQ    #4,A0
  222.     CLR.L    D1
  223. sq5l    MOVE.W    D1,(A0)+
  224.     DBRA    D7,sq5l
  225.  
  226. ; r = &b[prec+3];
  227. ; for( k=prec+1; k>=3; k-- )
  228. ; {
  229.     MOVE.L    D6,D7    ; prec
  230.     ASL.L    #1,D7
  231.     ADDA.L    D7,A3
  232.     ADDQ    #6,A3    ; r = &b[prec+3];
  233.     ADDQ.L    #2,D7    ; k = prec + 1
  234.  
  235. sq0l    MOVE.L    A4,A1    ; q = &a[3];
  236.     ADDQ    #6,A1
  237.     MOVEA.L    A4,A0
  238.     ADDA.L    D7,A0    ; p = &a[k];
  239.  
  240. ;while( p >= q )    
  241. ;    {
  242. sq1l    CMPA.L    A0,A1
  243.     BHI.S    sq3l
  244. ;    if( (*p == 0) || (*q == 0) )
  245. ;        {
  246. ;        --p;
  247. ;        ++q;
  248. ;        continue;
  249. ;        }
  250.     MOVE.L    (A0),D0
  251.     DATA.W    $4C11, $0403    ;MULU.L    (A1),D3:D0
  252.     CMPA.L    A0,A1
  253.     BEQ.S    sq2l
  254.  
  255.     CLR.L    D1
  256.     LSL.L    #1,D0        ; 2ab term of square
  257.     ROXL.L    #1,D3
  258.     ROXL.L    #1,D1
  259.     ADD.W    D1,-6(A3)
  260.  
  261. sq2l    SUBQ    #4,A0
  262.     ADDQ    #4,A1
  263. ;    SUBQ    #4,A3    ; accumulate in *r
  264.     CLR.L    D1
  265.  
  266.     ADD.L    D0,(A3)
  267.     MOVE.L    -(A3),D2
  268.     ADDX.L    D3,D2
  269.     MOVE.L    D2,(A3)
  270.     MOVE.W    -(A3),D2
  271.     ADDX.W    D1,D2
  272.     MOVE.W    D2,(A3)+
  273.     ADDQ    #4,A3
  274.     BRA    sq1l
  275.  
  276. ;    }
  277. ; --r;
  278. ; }
  279. sq3l    SUBQ    #4,A3
  280.     SUBQ    #4,D7
  281.     CMPI.W    #6,D7
  282.     BGE.S    sq0l
  283. ; shup1(b);
  284.     MOVE.L    12(A6),-(A7)
  285.     JSR    shup1
  286.     ADDQ    #4,A7
  287.     MOVEM.L    (A7)+,A1/A2/A3/A4/A5/D7/D6/D5/D3/D2/D1
  288.     UNLK    A6
  289.     RTS
  290.  
  291.  
  292. ; mulm( b, ac3 )
  293. ; unsigned short b[], ac3[];
  294. ; {
  295.     GLOBAL mulm
  296. mulm    LINK    A6,#0
  297.     MOVEM.L    D7/D6/D5/D4/D3/D2/D1/A5/A4/A3/A2/A1,-(A7)
  298.     MOVE.L    8(A6),A4    ; b
  299.     MOVE.L    12(A6),A2    ; ac3
  300.     SUBA.L    #NQ+NQ+6,A7
  301.     MOVE.L    A7,A5        ; act
  302. ; qclear( act );
  303.     MOVE.L    #NQ+2,D0
  304.     MOVE.L    A5,A1
  305.     CLR.L    D1
  306. mm0l
  307.     MOVE.W    D1,(A1)+
  308.     DBRA    D0,mm0l
  309.  
  310. ;act[0] = ac3[0];
  311. ;act[1] = ac3[1];
  312.     MOVE.L    A2,A0    ; ac3
  313.     MOVE.L    A5,A1    ; act
  314.     MOVE.W    (A0)+,(A1)+
  315.     MOVE.W    (A0)+,(A1)+
  316. ;r = &act[NQ+1];
  317.     MOVE.L    A5,A3
  318.     ADDA.L    #NQ+NQ+2,A3
  319. ;for( k=NQ-1; k>=3; k -= 2 )
  320. ;{
  321.     MOVE.L    #NQ-1,D7    ; k
  322. mm1l    CMP.B    #3,D7
  323.     BLT.S    mm7l
  324. ;if( k == NQ-1 )
  325. ;    {
  326. ;;    CMP.B    #NQ-1,D7
  327. ;;    BNE.S    mm3al
  328. ;    m = NQ-3;
  329. ;    o = 5;
  330. ;;    MOVE.L    #NQ-3,D6 ; m
  331. ;;    MOVE.L    #5,D5    ; o
  332. ;;    BRA.S    mm3bl
  333. ;    }
  334. ;else
  335. ;    {
  336. ;    m = k;
  337. ;    o = 3;
  338. mm3al    MOVE.L    D7,D6    ; m
  339.     MOVEQ.L    #3,D5
  340. ;    }
  341. ; p = &b[m];
  342. mm3bl    ASL.L    #1,D6    ; m
  343.     MOVE.L    A4,A0
  344.     ADDA.L    D6,A0    ; p
  345. ; q = &ac3[o];
  346.     ASL.L    #1,D5    ; o
  347.     MOVE.L    A2,A1
  348.     ADDA.L    D5,A1    ; q
  349.     SUB.W    D5,D6
  350.     ASR.W    #2,D6
  351. ; for( i=m; i>=o; i-- )
  352. ;    {
  353.     ADDQ    #4,A0
  354.     MOVE.L    (A3),D5
  355.     MOVE.L    -(A3),D4
  356.     MOVE.W    -(A3),D2
  357. mm2l
  358.     MOVE.L    -(A0),D0
  359.     DATA.W    $4C11, $0403    ;MULU.L    (A1),D3:D0
  360.     ADD.L    D0,D5
  361.     ADDX.L    D3,D4
  362.     ADDX.W    D1,D2
  363. mm4l
  364.     ADDQ.L    #4,A1
  365.     DBRA    D6,mm2l
  366. ;    }
  367. ;--r;
  368. mm6l
  369.     MOVE.W    D2,(A3)+
  370.     MOVE.L    D4,(A3)+
  371.     MOVE.L    D5,(A3)
  372.     SUBQ.L    #4,A3
  373.     SUBQ.L    #2,D7
  374.     BRA.S    mm1l
  375. ;}
  376. ;mdnorm( act );
  377. mm7l    MOVE.L    A5,-(A7)
  378.     JSR    mdnorm
  379.     ADDQ.L    #4,A7
  380. ;qmov( act, ac3 );
  381.     MOVE.L    A5,A0    ; act
  382.     MOVE.L    A2,A1    ; ac3
  383.     MOVE.L    #NQ-1,D0
  384. mm8l    MOVE.W    (A0)+,(A1)+
  385.     DBRA    D0,mm8l
  386. ;}
  387.     ADDA.L    #NQ+NQ+6,A7
  388.     MOVEM.L    (A7)+,A1/A2/A3/A4/A5/D7/D6/D5/D4/D3/D2/D1
  389.     UNLK    A6
  390.     RTS
  391.  
  392.  
  393. ;mulin( b, ac3 )
  394. ;unsigned short b[], ac3[];
  395. ;{
  396.     GLOBAL mulin
  397. mulin    LINK    A6,#0
  398.     MOVEM.L    D7/D6/D5/D2/D1/A5/A4/A3/A2/A1,-(A7)
  399.     MOVE.L    8(A6),A4    ; b
  400.     MOVE.L    12(A6),A2    ; ac3
  401.     SUBA.L    #NQ+NQ+4,A7
  402.     MOVE.L    A7,A5        ; act
  403. ; qclear( act );
  404.     MOVE.L    #NQ+1,D0
  405.     MOVE.L    A5,A1
  406.     CLR.L    D1
  407. mn0l
  408.     MOVE.W    D1,(A1)+
  409.     DBRA    D0,mn0l
  410.  
  411. ;act[0] = ac3[0];
  412. ;act[1] = ac3[1];
  413.     MOVE.L    A2,A0    ; ac3
  414.     MOVE.L    A5,A1    ; act
  415.     MOVE.W    (A0)+,(A1)+
  416.     MOVE.W    (A0)+,(A1)+
  417. ;r = &act[NQ];
  418.     MOVE.L    A5,A3
  419.     ADDA.L    #NQ+NQ,A3
  420. ;y = b[3];
  421.     CLR.L    D6
  422.     MOVE.W    6(A4),D6
  423. ;p = &ac3[NQ-1];
  424.     MOVE.L    A2,A1
  425.     ADDA.L    #NQ+NQ-2,A1
  426. ;for( i=NQ-1; i>=3; i-- )
  427. ;    {
  428.     MOVE.L    #NQ-1,D7
  429. mn1l    CMP.B    #2,D7
  430.     BEQ.S    mn7l
  431. ;    if( *p == 0 )
  432. ;        {
  433. ;        --p;
  434. ;        --r;
  435. ;        continue;
  436. ;        }
  437.     MOVE.L    D6,D0
  438.     MULU    (A1),D0
  439.     SUBQ    #2,A1
  440.     SUBQ    #2,A3
  441.     ADD.L    D0,(A3)
  442.     MOVE.W    -(A3),D2
  443.     ADDX.W    D1,D2
  444.     MOVE.W    D2,(A3)+
  445. ;    ADDQ    #2,A3
  446. ;    }
  447.     SUBQ    #1,D7
  448.     BRA.S    mn1l
  449. ;mdnorm( act );
  450. mn7l    MOVE.L    A5,-(A7)
  451.     JSR    mdnorm
  452.     ADDQ    #4,SP
  453. ;qmov( act, ac3 );
  454.     MOVE.L    A5,A0    ; act
  455.     MOVE.L    A2,A1    ; ac3
  456.     MOVE.L    #NQ-1,D0
  457. mn8l    MOVE.W    (A0)+,(A1)+
  458.     DBRA    D0,mn8l
  459. ;}
  460.     ADDA.L    #NQ+NQ+4,A7
  461.     MOVEM.L    (A7)+,A1/A2/A3/A4/A5/D7/D6/D5/D2/D1
  462.     UNLK    A6
  463.     RTS
  464.  
  465. ;divsh( a, prod )
  466.     GLOBAL divsh
  467. divsh    LINK    A6,#0
  468.     MOVEM.L    D7/D6/D5/D2/D1/A5/A4/A3/A2/A1,-(A7)
  469.     MOVE.L    8(A6),A4    ; a
  470.     MOVE.L    12(A6),A5    ; prod
  471.  
  472. ;prod[NQ] = 0;
  473.     CLR.W    NQ+NQ(A5)
  474. ;prod[NQ+1] = 0;
  475.     CLR.W    NQ+NQ+2(A5)
  476. ;prod[NQ+2] = 0;
  477.     CLR.W    NQ+NQ+4(A5)
  478. ;shdn1( prod );
  479.     MOVE.L    A5,-(A7)
  480.     JSR    shdn1
  481.     ADDQ    #4,A7
  482. ;shdn1( prod );
  483.     MOVE.L    A5,-(A7)
  484.     JSR    shdn1
  485.     ADDQ    #4,A7
  486. ;d = a[3];
  487.     MOVE.L    #-65536,D5    ; 0xffff0000
  488.     MOVE.W    6(A4),D6
  489.     SWAP    D6
  490.     AND.L    D5,D6
  491. ;u = ((unsigned long )prod[3] << 16) | prod[4];
  492.     MOVE.L    A5,A0
  493.     ADDA.L    #6,A0    ; &prod[3]
  494.     MOVE.L    A0,A1
  495.     MOVE.L    (A0)+,D0
  496.     MOVE.L    (A0)+,D1
  497.  
  498. ;for( i=3; i<NQ; i++ )
  499. ;    {
  500.     MOVE.L    #3,D7
  501. ds1l    CMP.B    #NQ,D7
  502.     BGT.S    ds2l
  503. ;    qu = u / d;
  504.     DATA.W    $4C46, $1400    ; DIVU.L D6,D0:D1
  505. ;    prod[i] = qu;
  506.     MOVE.L    D1,(A1)+
  507. ;    u = ((u - (unsigned long )d * qu) << 16) | prod[i+2];
  508.     MOVE.L    (A0)+,D1
  509. ;    }
  510.     ADDQ.L    #2,D7
  511.     BRA.S    ds1l
  512. ds2l
  513. ; prod[NQ] = u / d;
  514. ;    DIVU.W    D6,D0
  515. ;    MOVE.W    D0,(A1)+
  516.     MOVEM.L    (A7)+,A1/A2/A3/A4/A5/D7/D6/D5/D2/D1
  517.     UNLK    A6
  518.     RTS
  519.  
  520.  
  521. ;    move a to b
  522. ;
  523. ;    short a[NQ], b[NQ];
  524. ;    qmov( a, b );
  525.  
  526.     GLOBAL qmov
  527. qmov    LINK    A6,#0
  528.     MOVE.L    A1,-(A7)
  529.     MOVE.L    8(A6),A0
  530.     MOVE.L    12(A6),A1
  531.     MOVE.L    #NQ/2-1,D0    ; 2*(11+1) = NQ words
  532. qm1l    MOVE.L    (A0)+,(A1)+
  533.     DBRA    D0,qm1l
  534.     MOVE.L    (A7)+,A1
  535.     UNLK    A6
  536.     RTS
  537.  
  538.  
  539.  
  540. ;qmovz( a, b )
  541. ; Same as qmov but clears 1 low guard word at 25th array position
  542.     GLOBAL qmovz
  543. qmovz    LINK    A6,#0
  544.     MOVE.L    A1,-(A7)
  545.     MOVE.L    8(A6),A0
  546.     MOVE.L    12(A6),A1
  547.     MOVE.L    #NQ/2-1,D0    ; 2*(11+1) = NQ words
  548. qmz1l    MOVE.L    (A0)+,(A1)+
  549.     DBRA    D0,qmz1l
  550.     CLR.W    (A1)+
  551.     MOVE.L    (A7)+,A1
  552.     UNLK    A6
  553.     RTS
  554.  
  555.     GLOBAL qclear
  556. qclear    LINK    A6,#0
  557.     MOVE.L    D1,-(A7)
  558.     MOVEQ    #0,D1
  559.     MOVE.L    8(A6),A0
  560.     MOVE.L    #NQ/2-1,D0    ; 2*(11+1) = NQ words
  561. qm1l    MOVE.L    D1,(A0)+
  562.     DBRA    D0,qm1l
  563.     MOVE.L    (A7)+,D1
  564.     UNLK    A6
  565.     RTS
  566.  
  567.  
  568. sqr    equ    -NQ-NQ-6    ; -54
  569. prod    equ    -4*NQ-12    ; -108
  570. quot    equ    -6*NQ-18    ; -162
  571. ; divm( a, b )
  572. ; unsigned short a[], b[];
  573.     GLOBAL divm
  574. divm     LINK       A6,#-188
  575.          MOVEM.L    D7/D6/D5/D2/D1/A5/A4/A3/A2,-(A7)
  576.          MOVE.L     8(A6),A3
  577.          MOVE.L     12(A6),A5
  578.          LEA        prod(A6),A4
  579.     LEA    8(A3),A2    ; &a[4]
  580.     MOVEQ    #NQ-5,D5
  581. dvm1al    TST.W    (A2)+
  582.     BNE.S    dvm48l
  583.     DBRA    D5,dvm1al
  584.          MOVE.L     A4,-(A7)    ; prod
  585.          MOVE.L     A5,-(A7)    ; b
  586.          JSR        qmov
  587.          ADDQ.W     #8,A7
  588.          MOVE.L     A4,-(A7)    ; prod
  589.          MOVE.L     A3,-(A7)    ; a
  590.          JSR        divsh
  591.          ADDQ.W     #8,A7
  592.          BRA        dvm100l
  593. dvm48l
  594.     LEA    quot(A6),A0
  595.     MOVE.L    #NQ+2,D0
  596.     CLR.L    D1
  597. dvm49l    MOVE.W    D1,(A0)+
  598.     DBRA    D0,dvm49l
  599.          MOVE.L     A4,-(A7)
  600.          JSR        qclear
  601.          ADDQ.W     #4,A7
  602.          PEA        sqr(A6)
  603.          JSR        qclear
  604.          ADDQ.W     #4,A7
  605.     MOVEQ      #0,D0
  606.     MOVE.W     6(A3),D0    ; a[3]
  607.     MOVE.L     #1073741824,D1
  608.          DIVU    D0,D1
  609.          MOVE.W     D1,quot+6(A6)    ; quot[3]
  610.          MOVEQ      #2,D7    ; prec
  611.          MOVEQ      #1,D6    ; k
  612. dvm86l         MOVEQ      #NQ-2,D0
  613.          CMP.L      D7,D0
  614.          BLE.S      dvme2l
  615.          MOVE.L     D6,D0
  616.          LSL.L      #1,D0
  617.          MOVE.L     D0,D6
  618.          MOVEQ      #NQ-2,D0
  619.          CMP.L      D6,D0
  620.          BGE.S      dvm9cl
  621.          MOVEQ      #NQ-2,D7    ; prec = NQ - 2
  622.          BRA.S      dvm9el
  623. dvm9cl         MOVE.L     D6,D7
  624. dvm9el         MOVE.L     D7,-(A7)
  625.          PEA        sqr(A6)
  626.          PEA        quot(A6)
  627.          JSR        squarev
  628.          ADDA.W     #12,A7
  629.          MOVE.L     D7,-(A7)
  630.          MOVE.L     A4,-(A7)
  631.          PEA        sqr(A6)
  632.          MOVE.L     A3,-(A7)
  633.          JSR        mulv
  634.          ADDA.W     #16,A7
  635.          PEA        quot(A6)
  636.          MOVE.L     A4,-(A7)
  637.          JSR        subm
  638.          ADDQ.W     #8,A7
  639.          PEA        quot(A6)
  640.          JSR        shup1
  641.          ADDQ.W     #4,A7
  642.          BRA.S      dvm86l
  643. dvme2l    MOVE.L    #NQ-2,-(A7)
  644.          MOVE.L     A4,-(A7)
  645.          MOVE.L     A5,-(A7)
  646.          PEA        quot(A6)
  647.          JSR        mulv
  648.          ADDA.W     #16,A7
  649.          MOVE.W     (A5),(A4)
  650.          MOVE.W     2(A5),2(A4)
  651. dvm100l         MOVE.L     A4,-(A7)
  652.          JSR        mdnorm
  653.          MOVE.L     A5,(A7)
  654.          MOVE.L     A4,-(A7)
  655.          JSR        qmov
  656.          ADDQ.W     #8,A7
  657.          MOVEM.L    (A7)+,A2/A3/A4/A5/D1/D2/D5/D6/D7
  658.          UNLK       A6
  659.          RTS        
  660.  
  661.  
  662.     GLOBAL mdnorm
  663. mdnorm   LINK       A6,#0
  664.          MOVEM.L    D7/A5/A4/A3/A2,-(A7)
  665.          MOVE.L     8(A6),A4
  666. ;    LEA    rndset,A3
  667. ;    MOVE.W     (A3),D0
  668. ;        EXT.L      D0
  669. ;         BNE.S      mdn38l
  670. ;         PEA        rndbit
  671. ;    MOVE.L    (A7),A2
  672. ;         JSR        qclear
  673. ;         ADDQ.W     #4,A7
  674. ;         MOVEQ      #1,D0
  675. ;         MOVE.W     D0,NQ+NQ-2(A2)
  676. ;         CLR.W      NQ+NQ(A2)
  677. ;         MOVE.W     D0,(A3)    ;rndset
  678. ;mdn38l
  679.     LEA        2(A4),A5
  680.          CLR.L      D7
  681.          BRA.S      mdn62l
  682. mdn40l    MOVEQ      #0,D0
  683.          MOVE.W     4(A4),D0
  684.          BNE.S      mdn4al
  685.          BRA.S      mdn68l
  686. mdn4al    MOVE.L     A4,-(A7)
  687.          JSR        shdn1
  688.          ADDQ.W     #4,A7
  689.          ADDQ.W     #1,(A5)
  690.          MOVE.W     (A5),D0
  691.          EXT.L      D0
  692.          BGE.S      mdn60l
  693.          MOVE.W     #32767,(A5)
  694. mdn60l         ADDQ.L     #1,D7
  695. mdn62l         MOVEQ      #3,D0
  696.          CMP.L      D7,D0
  697.          BGT.S      mdn40l
  698. mdn68l         CLR.L      D7
  699.          BRA.S      mdn92l
  700. mdn6cl         MOVEQ      #0,D0
  701.          MOVE.W     6(A4),D0
  702.          AND.L      #32768,D0
  703.          BEQ.S      mdn7cl
  704.          BRA.S      mdn98l
  705. mdn7cl         MOVE.L     A4,-(A7)
  706.          JSR        shup1
  707.          ADDQ.W     #4,A7
  708.          SUBQ.W     #1,(A5)
  709.          MOVE.W     (A5),D0
  710.          EXT.L      D0
  711.          BGE.S      mdn90l
  712.          CLR.W      (A5)
  713. mdn90l         ADDQ.L     #1,D7
  714. mdn92l         MOVEQ      #3,D0
  715.          CMP.L      D7,D0
  716.          BGT.S      mdn6cl
  717. mdn98l         MOVEQ      #0,D0
  718.          MOVE.W     NQ+NQ(A4),D0
  719.          AND.L      #32768,D0
  720.          BEQ.S      mdnb6l
  721.          MOVE.L     A4,-(A7)
  722.          PEA        rndbit
  723.          JSR        addm
  724.          ADDQ.W     #8,A7
  725. mdnb6l         TST.W      4(A4)
  726.          BEQ.S      mdnd2l
  727.          MOVE.L     A4,-(A7)
  728.          JSR        shdn1
  729.          ADDQ.W     #4,A7
  730.          ADDQ.W     #1,(A5)
  731.          MOVE.W     (A5),D0
  732.          EXT.L      D0
  733.          BGE.S      mdnd2l
  734.          MOVE.W     #32767,(A5)
  735. mdnd2l         CLR.W      NQ+NQ(A4)
  736.          MOVEM.L    (A7)+,A2/A3/A4/A5/D7
  737.          UNLK       A6
  738.          RTS        
  739.  
  740.  
  741.  
  742. qfltc    LINK       A6,#0
  743.          UNLK       A6
  744.          RTS        
  745.  
  746. ; for 24 word format
  747. rndbit    DATA.W 0,0,0,0,0,0,0,0
  748.     DATA.W 0,0,0,0,0,0,0,0
  749.     DATA.W 0,0,0,0,0,0,0,1,0
  750.  
  751. ; for 12 word format
  752. ;rndbit    DATA.W 0,0,0,0,0,0,0,0
  753. ;    DATA.W 0,0,0,1,0
  754.  
  755. ;rndset    DATA.W  0
  756.  
  757.     END
  758.